package com.aura.common.redis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;
import org.apache.commons.lang3.StringUtils;

import java.util.Collections;
import java.util.Objects;

/**
 * @ClassName RedisLuaService
 * @Description
 * @Author ZJX
 * @Date 2025/7/19 23:54
 * @Version 1.0
 **/
@Component
public class RedisLuaService {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 原子删除：只有当 Redis 中 key 对应的值与传入 value 相等时，才删除 key。
     * 常用于防止误删（如分布式锁释放、幂等校验等场景）
     *
     * @param key   Redis 键
     * @param value 期望值（对比用）
     * @return 删除成功返回 true，否则返回 false
     */
    public boolean deleteIfMatch(String key, String value) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(value)) {
            return false;
        }

        final String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);

        Long result = (Long) redisTemplate.execute(redisScript, Collections.singletonList(key), value);
        return result != null && result == 1L;
    }

}
